/* Использование LCD Функций для дисплеев, подключенных в режиме 
   отображения 8 битовой памяти */

/* Используется LCD 2x16 с русифицированным знакогенератором,
   микроконтроллер AT90S8515. Схема подключения см. рис. 382 */ 
   
/* Эту программу можно использовать для просмотра прошивки 
   знакогенератора LCD */
      
/* В верхней строке LCD с задержкой в 1 сек будут выводиться коды символов
   от 0 до 255, а в нижней строке - изображение символа с этим кодом
   Все это циклически повторяется */

#include <90s8515.h> 		// подключаем  заголовочный файл используемого 
				    		// микроконтроллера AVR
 
/* Теперь, перед использованием LCD Функций для дисплеев, 
   подключенных в режиме отображения 8-битовой памяти, подключим 
   заголовочный файл lcdstk.h */ 
#include <lcdstk.h>

/* подключим функции ввода-вывода */ 
#include <stdio.h>

/* подключим функции задержки */ 
#include <delay.h>

char string_LCD[20];  	// определим строку для вывода на LCD, т.е.
 				// зарезервируем место в SRAM под массив 
// из 20 символов

/* Основная функция программы */ 

void main(void) 
{
unsigned int code_symbol;

/* Инициализируем LCD 2x16 */ 
lcd_init(16);

while (1)         // бесконечный цикл while 
{
/* Тело цикла while (см. "Оператор while", стр. 336) */

/* Оператор цикла for (см. "Оператор for", стр. 335) */
for (code_symbol=0x00; code_symbol<=255; code_symbol++) 	          {
          	/* Очистим LCD и установим курсор в ряд 0 и столбец 0 */          
          	lcd_clear();
          
          	/* Сформируем строку string_LCD для вывода на LCD 
   (см. "Стандартные Функции Ввода/Вывода", стр. 378) */
#pragma ruslcd+	// Включим автоматическую перекодировку
// символов кириллицы
          		sprintf(string_LCD,"Код:     0x%02x", code_symbol);
#pragma ruslcd-	// Выключим автоматическую перекодировку
// символов кириллицы

/* Функция sprintf осуществляет форматные преобразования и 
     помещает результат в строку string_LCD
     Спецификация преобразования "Код:     0x%02x\n" означает, что
     сначала будут выведена последовательность "Код:     0x", 
     затем значение переменной code_symbol в шестнадцатиричном 
     виде символами нижнего регистра (символ преобразования 'x'),
     причем будет выведено, по крайней мере, 2 символа. Если
     результат имеет менее чем 2 символа, то слева он заполнится
     нулями (описатель width '02') */
          
          	/* Выведем строку string_LCD на LCD в позицию курсора */
          	lcd_puts(string_LCD);

          	/* Установим курсор в начало второй строки LCD */
          	lcd_gotoxy(0,1);

/* Аналогичным способом можно было вывести и вторую строку:

     sprintf(string_LCD, "Символ:    %c",code_symbol);
     lcd_puts(string_LCD);

     но, чтобы показать использование других LCD Функций 
     для дисплеев с вплоть до 2x40 символов, сделаем вывод 
     второй строки другим способом */

/* Вывод второй строки на LCD в позицию курсора */
#pragma ruslcd+	// Включим автоматическую перекодировку
// символов кириллицы
lcd_putsf("Символ:");
#pragma ruslcd-	// Выключим автоматическую перекодировку
// символов кириллицы
/* Выведем в текущую позицию курсора строку "Символ"
     Обратите внимание, что здесь нужно использовать функцию
     lcd_putsf, а не lcd_puts, т.к. при такой записи строка
     "Symbol" располагается во FLASH памяти, а не в SRAM */

/* Установим курсор в позицию 10 второй строки LCD (счет 
     позиций начинается с 0) */
lcd_gotoxy(10,1);

/* Выведем в текущую позицию курсора символ, код которого
     соответствует значения code_symbol */
lcd_putchar(code_symbol);
                    
/* Сделаем задержку в 1 сек */
delay_ms(1000);
    }; 			// закрывающая скобка для цикла for
    code_symbol=0x00; 	// обнулим значение code_symbol и все повторим
};				// закрывающая скобка для цикла while
}					// закрывающая скобка для функции main
